package com.ssm.zy.utils;

import com.ssm.zy.common.exception.ServerErrorException;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import org.springframework.stereotype.Component;

import java.util.Base64;
import java.util.Date;
import java.util.Map;

/**
 * @author 郑智辰~
 * @version 1.0
 *
 * JTW令牌 “生成” 与 “分析”
 */
@Component
public class JWTUtil {
    //签名私钥
    private String key = "XHS-SSM";
    //失效时间
    private Long time = 60l * 60l * 1000l;

    /**
     * 生成签名token
     */
    public String createJWT(String id, String subject, Map<String,Object> map){
        //1.设置过期的时间
        long now = System.currentTimeMillis();//当前时间(毫秒)
        long exp = now+time;
        //2.1 生成token令牌
        //进行Base64加密
        String encode = Base64.getEncoder().encodeToString(key.getBytes());
        JwtBuilder jwtBuilder = Jwts.builder()
                .setId(id)//tokenID
                .setSubject(subject)//token主题
                .setIssuedAt(new Date())//发布时间
                .signWith(SignatureAlgorithm.HS256, encode);//token秘钥
        //2.2 将自定义token属性的map集合解析，并设置到jwtBuilder中
        for(Map.Entry<String,Object> entry:map.entrySet()){
            jwtBuilder.claim(entry.getKey(),entry.getValue());
        }
        //3.设置token过期时间
        if(time>0){
            jwtBuilder.setExpiration(new Date(exp));
        }
        //4.获取token字符串
        String token = jwtBuilder.compact();
        return token;
    }

    /**
     * 解析token
     */
    public Claims parseJWT(String token){
        Claims claims = null;
        //进行Base64加密
        String encode = Base64.getEncoder().encodeToString(key.getBytes());
        try {
            claims = Jwts.parser()
                    .setSigningKey(encode)//放入当前JwtUtils秘钥
                    .parseClaimsJws(token)//放入要解析的token
                    .getBody();
        }catch (Exception e){
            throw new ServerErrorException();//这里抛出异常的话，说明token有可能过期了，或者根本不存在！
        }
        return claims;
    }
}
